package com.lh.springcloud.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

// 声明这是一个Spring组件，可以被自动扫描和注入
@Component
// 使用Lombok注解，为这个类生成一个日志对象，可以直接使用log.info等方法打印日志
@Slf4j
// 定义一个类，实现GlobalFilter和Ordered接口，表示这是一个全局过滤器，可以对所有请求进行拦截和处理
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
    @Override
    // 定义一个过滤器方法，参数是ServerWebExchange和GatewayFilterChain，返回一个Mono<Void>类型的响应
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 打印日志，记录当前时间
        log.info("******com in MyLogGateWayFilter: " + new Date());
        // 从请求中获取uname参数的第一个值，赋值给uname变量
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        // 判断uname是否为空
        if (uname == null) {
            // 如果为空，打印提示信息
            System.out.println("****用户名为null，非法用户，/(ㄒoㄒ)/~~");
            // 设置响应的状态码为406，表示不接受这个请求
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            // 返回一个完成的响应，不再继续处理
            return exchange.getResponse().setComplete();
        }
        // 如果uname不为空，继续调用过滤器链的filter方法，传递exchange参数，进行后续的处理
        return chain.filter(exchange);
    }

    @Override
    // 定义一个获取顺序的方法，返回一个int类型的值
    public int getOrder() {
        // 返回0，表示这个过滤器的优先级最高，会先执行
        return 0;
    }
}
